// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/public/test/background_sync_test_util.h"

#include "base/run_loop.h"
#include "base/task_runner_util.h"
#include "content/browser/background_sync/background_sync_context.h"
#include "content/browser/background_sync/background_sync_manager.h"
#include "content/browser/background_sync/background_sync_network_observer.h"
#include "content/browser/storage_partition_impl.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "net/base/network_change_notifier.h"

namespace content {
namespace background_sync_test_util {

    namespace {

        void SetOnlineOnIOThread(
            const scoped_refptr<BackgroundSyncContext>& sync_context,
            bool online)
        {
            DCHECK_CURRENTLY_ON(BrowserThread::IO);

            BackgroundSyncManager* sync_manager = sync_context->background_sync_manager();
            BackgroundSyncNetworkObserver* network_observer = sync_manager->GetNetworkObserverForTesting();
            if (online) {
                network_observer->NotifyManagerIfNetworkChangedForTesting(
                    net::NetworkChangeNotifier::CONNECTION_WIFI);
            } else {
                network_observer->NotifyManagerIfNetworkChangedForTesting(
                    net::NetworkChangeNotifier::CONNECTION_NONE);
            }
        }

        StoragePartitionImpl* GetStoragePartition(WebContents* web_contents)
        {
            return static_cast<StoragePartitionImpl*>(BrowserContext::GetStoragePartition(
                web_contents->GetBrowserContext(), web_contents->GetSiteInstance()));
        }

    } // namespace

    // static
    void SetIgnoreNetworkChangeNotifier(bool ignore)
    {
        BackgroundSyncNetworkObserver::SetIgnoreNetworkChangeNotifierForTests(ignore);
    }

    // static
    void SetOnline(WebContents* web_contents, bool online)
    {
        BrowserThread::PostTask(
            BrowserThread::IO, FROM_HERE,
            base::Bind(&SetOnlineOnIOThread,
                base::Unretained(GetStoragePartition(web_contents)
                                     ->GetBackgroundSyncContext()),
                online));
        base::RunLoop().RunUntilIdle();
    }

} // namespace background_sync_test_util

} // namespace content
